package com.example.distinguish_server.Utils.List;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
 public class ReflectUtil {
     /**
     * 利用反射获取指定对象的指定属性
     * @param obj 目标对象
     * @param fieldName 目标属性
     * @return 目标属性的值
     */
    public static Object getFieldValue(Object obj, String fieldName) {
        Object result = null;
        Field field = getField(obj, fieldName);
        if (field != null) {
            field.setAccessible(true);
            try {
                result = field.get(obj);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
     /**
     * 利用反射获取指定对象里面的指定属性
     * @param obj 目标对象
     * @param fieldName 目标属性
     * @return 目标字段
     */
    private static Field getField(Object obj, String fieldName) {
        Field field = null;
        for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                field = clazz.getDeclaredField(fieldName);
                break;
            } catch (NoSuchFieldException e) {
                // 如果该类没有找到该属性，那么就向父类中查找
            }
        }
        return field;
    }
     /**
     * 利用反射调用指定对象的指定方法
     * @param obj 目标对象
     * @param methodName 目标方法名
     * @param args 参数列表
     * @return 方法的返回值
     */
    public static Object invokeMethod(Object obj, String methodName, Object... args) {
        Object result = null;
        Method method = getMethod(obj, methodName, args);
        if (method != null) {
            method.setAccessible(true);
            try {
                result = method.invoke(obj, args);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }
     /**
     * 利用反射获取指定对象里面的指定方法
     * @param obj 目标对象
     * @param methodName 目标方法名
     * @param args 参数列表
     * @return 目标方法
     */
    private static Method getMethod(Object obj, String methodName, Object[] args) {
        Method method = null;
        for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                method = clazz.getDeclaredMethod(methodName, getParameterTypes(args));
                break;
            } catch (NoSuchMethodException e) {
                // 如果该类没有找到该方法，那么就向父类中查找
            }
        }
        return method;
    }
     /**
     * 获取参数列表中每个参数的类型
     * @param args 参数列表
     * @return 参数类型列表
     */
    private static Class<?>[] getParameterTypes(Object[] args) {
        Class<?>[] result = new Class<?>[args.length];
        for (int i = 0; i < args.length; i++) {
            result[i] = args[i].getClass();
        }
        return result;
    }
}